data Expr = Const Float
          |  Add Expr Expr
          | Neg Expr
          | Mult Expr Expr

--foldExpr :: 
foldExpr (fConst,_,_,_) (Const c) = fConst c
foldExpr f@(_,fAdd,_,_) (Add e1 e2) = foldExpr f e1 `fAdd` foldExpr f e2
foldExpr f@(_,_,fNeg,_) (Neg e) = fNeg (foldExpr f e)
foldExpr f@(_,_,_,fMult) (Mult e1 e2) = foldExpr f e1 `fMult` foldExpr f e2

eval = foldExpr(\x -> x,(+),\x -> -x,(*))

--eval (Mult (Const 2.0) (Add (Const 3.0) (Const 4.0)))

